package de.bw.jeans.alarminfo.tools;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.ArrayList;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;

import android.content.Context;
import android.util.Log;
import android.util.Xml;
import de.bw.jeans.alarminfo.datatypes.Alarmdaten;

public class XmlFileTools {
	
	private static final String XML_FILENAME = "alarmDaten.xml";

	public static void writeAlertXmlFile(ArrayList<Alarmdaten> alarmDatenListe, Context context) {
		
		// Prüfen, ob überhaupt Daten ermittelt wurden
		if(alarmDatenListe.isEmpty())
			return;
		
		// Das File bereitstellen
		File xmlFile = context.getFileStreamPath(XML_FILENAME);
		
		// Das bisherige File löschen
		if(xmlFile.exists())
			xmlFile.delete();
		
		// Das neue File erstellen
		XmlSerializer xmlSerializer = Xml.newSerializer();
		StringWriter writer = new StringWriter();
		
		try {
			xmlSerializer.setOutput(writer);
			xmlSerializer.startDocument("UTF-8", true);
			xmlSerializer.startTag("", "alerts");
			
			for (Alarmdaten alarmdaten : alarmDatenListe) {
				xmlSerializer.startTag("", "alert");
				xmlSerializer.attribute("", "Id", 				alarmdaten.getAlarmId());
				xmlSerializer.attribute("", "Stichwort", 		alarmdaten.getStichwort());
				xmlSerializer.attribute("", "Patientenname", 	alarmdaten.getPatientenname());
				xmlSerializer.attribute("", "Strasse", 			alarmdaten.getEinsatzStrasse());
				xmlSerializer.attribute("", "Ort", 				alarmdaten.getEinsatzOrt());
				xmlSerializer.attribute("", "Laengengrad", 		alarmdaten.getLaengengrad());
				xmlSerializer.attribute("", "Breitengrad", 		alarmdaten.getBreitengrad());
				xmlSerializer.attribute("", "Name", 			alarmdaten.getMelderName());
				xmlSerializer.attribute("", "Zusatz", 			alarmdaten.getMelderZusatz());
				xmlSerializer.attribute("", "Erreichbarkeit", 	alarmdaten.getMelderErreichbarkeit());
				xmlSerializer.attribute("", "Datum", 			alarmdaten.getMailDatum());
				xmlSerializer.attribute("", "Zeit", 			alarmdaten.getMailUhrzeit());
				xmlSerializer.attribute("", "Html", 			alarmdaten.getMailHtml());
				xmlSerializer.endTag("", "alert");
			}
			
			xmlSerializer.endTag("", "alerts");
			xmlSerializer.endDocument();
			
			FileOutputStream fos = context.openFileOutput(XML_FILENAME, Context.MODE_PRIVATE);
			fos.write(writer.toString().getBytes());
			fos.close();
			
		} catch (Exception ex) {
			Log.d("AlarmInfo", "Fehler beim schreiben des Alarm-XML-Files!");
		} 
		
	}
	
	public static ArrayList<Alarmdaten> readAlertXmlFile(Context context) {
		
		ArrayList<Alarmdaten> alarmdaten = new ArrayList<Alarmdaten>();
		
		// Einlesen des XML-Files
		try {
			File xmlFile = context.getFileStreamPath(XML_FILENAME);
			InputStream is = new BufferedInputStream(new FileInputStream(xmlFile));
		
			XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
			parser.setInput(is, null);
			
			int eventType = parser.getEventType();
			while(eventType != XmlPullParser.END_DOCUMENT) {
				switch(eventType) {
					case XmlPullParser.START_TAG:
						String tagName = parser.getName();
						if(tagName.equals("alert")) {
							Alarmdaten newAlarmdaten = new Alarmdaten();
							newAlarmdaten.setAlarmId(parser.getAttributeValue("", "Id"));
							newAlarmdaten.setStichwort(parser.getAttributeValue("", "Stichwort"));
							newAlarmdaten.setPatientenname(parser.getAttributeValue("", "Patientenname"));
							newAlarmdaten.setEinsatzStrasse(parser.getAttributeValue("", "Strasse"));
							newAlarmdaten.setEinsatzOrt(parser.getAttributeValue("", "Ort"));
							newAlarmdaten.setLaengengrad(parser.getAttributeValue("", "Laengengrad"));
							newAlarmdaten.setBreitengrad(parser.getAttributeValue("", "Breitengrad"));
							newAlarmdaten.setMelderName(parser.getAttributeValue("", "Name"));
							newAlarmdaten.setMelderZusatz(parser.getAttributeValue("", "Zusatz"));
							newAlarmdaten.setMelderErreichbarkeit(parser.getAttributeValue("", "Erreichbarkeit"));
							newAlarmdaten.setMailDatum(parser.getAttributeValue("", "Datum"));
							newAlarmdaten.setMailUhrzeit(parser.getAttributeValue("", "Zeit"));
							newAlarmdaten.setMailHtml(parser.getAttributeValue("", "Html"));
							alarmdaten.add(newAlarmdaten);
						}
					break;
				}
				eventType = parser.next();
			}
		}
		catch (Exception ex) {
			Log.d("AlarmInfo", "Fehler beim lesen des Alarm-XML-Files!");
		}
		
		return alarmdaten;
	}
}
